/* Copyright (C) 2007 Free Software Foundation, Inc.
 * See the copyright notice in the file /usr/LICENSE.
 * Created by flyan on 2020/5/24.
 * QQ: 1341662010
 * QQ-Group:909830414
 * gitee: https://gitee.com/flyanh/
 *
 * 给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
 *
 * 如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
 *
 * 您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
 *
 * 示例：
 *
 * 输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
 * 输出：7 -> 0 -> 8
 * 原因：342 + 465 = 807
 */
#include <cstdlib>
#include <vector>
#include <stack>
#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        int ans_val, a, b;
        int carry = 0;
        ListNode ret = {0};    /* 包含结果的值 */
        ListNode *tmp = &ret;
        while (l1 || l2 || carry) {
            /* 得到要相加的同位数字 */
            a = (l1 == nullptr ? 0 : l1->val);
            b = (l2 == nullptr ? 0 : l2->val);

            /* 相加并添加到结果 */
            ans_val = a + b + carry;
            tmp = tmp->next = new ListNode(ans_val % 10);

            /* 是否存在进位？ */
            carry = ans_val / 10;

            /* 进行下一位的比较 */
            if(l1) l1 = l1->next;
            if(l2) l2 = l2->next;
        }
        return ret.next;
    }
};

int main(void) {
    ListNode *tmp;
    ListNode a = { 2};
    tmp = a.next = new ListNode(4);
    tmp->next = new ListNode(3);

    ListNode b = { 5 };
    tmp = b.next = new ListNode(6);
    tmp->next = new ListNode(4);

    Solution sol;
    ListNode *ans_list = sol.addTwoNumbers(&a, &b);

    /* print ans */
    stack<int> ans;
    while (ans_list) {
        ans.push(ans_list->val);
        ans_list = ans_list->next;
    }
    while (!ans.empty()) {
        cout << ans.top();
        ans.pop();
    }
    cout << endl;
}

